package tw.spring.demo.controller;

import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import tw.spring.demo.model.AjaxResponse;
import tw.spring.demo.model.Article;
import tw.spring.demo.service.ArticleService;

import javax.annotation.Resource;
import java.util.Date;

/**
 * @author: 陈艺博
 * @date: 2021-02-03 21:24
 * @description: 文章管理API
 **/

@Slf4j
@RestController
@RequestMapping("/rest")
//@Api( tags = "文章管理API")
public class ArticleController {

    /**
     * 获取一篇Article，使用GET方法,根据id查询一篇文章
     * 执行操作 获取
     * 请求方式 Get
     * 传参形式 PathVariable, 在请求路径中显示请求值
     * 访问地址 /rest/articles/1
     */
    @GetMapping(value = "/articles/{id}")
    public AjaxResponse getArticle(@PathVariable("id") Long id) {

        // 使用lombok提供的builder构造对象
        Article article = Article.builder()
                .id(id)
                .author("YiBo")
                .title("获取文章内容")
                .content("学习SpringBoot")
                .creatDate(new Date()).build();

        log.info("article: " + article);

        return AjaxResponse.success(article);
    }

    /**
     * 增加一篇Article ，使用POST方法(RequestBody方式接收参数)
     * 执行操作 添加
     * 请求方式 POST
     * 传参形式 RequestBody、 RequestHeader， 在Body体内， Http请求头中携带参数， 请求路径上没有显示
     * 访问地址 /rest/articles  Body->JSON, Headers HeaderValue
     */
    @RequestMapping(value = "/articles", method = RequestMethod.POST)
    public AjaxResponse saveArticle(@RequestBody Article article, @RequestHeader String headerValue) {

        //因为使用了lombok的Slf4j注解，这里可以直接使用log变量打印日志
        article.setUpdateDate(new Date());
        log.info("saveArticle: " + article);
        return AjaxResponse.success(article);
    }

    /**
     * 增加一篇Article ，使用POST方法(RequestParam方式接收参数)
     * 执行操作 添加
     * 请求方式 POST
     * 传参形式 RequestParam
     * 访问地址 /rest/articles?author="author"&title="title"&content="content"
     */
    @ApiOperation(value = "添加文章", notes = "添加新的文章", tags = "Article", httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "author", value = "文章作者", required = true, dataType = "String"),
            @ApiImplicitParam(name = "title", value = "文章标题", required = true, dataType = "String"),
            @ApiImplicitParam(name = "content", value = "文章内容", required = true, dataType = "String")
    })
    @ApiResponses({
            @ApiResponse(code = 200, message = "成功", response = AjaxResponse.class),
    })
    @PostMapping("/articles/v1")
    public AjaxResponse saveArticle(@RequestParam String author, @RequestParam String title, @RequestParam String content,
                                    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date createTime) {

        log.info("saveArticle:" + createTime);
        return AjaxResponse.success();
    }

    /**
     * 增加一篇Article ，使用POST方法(RequestBody方式接收参数)
     * 执行操作 添加
     * 请求方式 POST
     * 传参形式 RequestBody， 在Body体内
     * 访问地址 /rest/articles  Body->JSON
     */
    @PostMapping(value = "/articles/v2")
    public AjaxResponse saveArticle(@RequestBody Article article) {
        log.info("saveArticle: " + article);
        return AjaxResponse.success(article);
    }

    @PostMapping(value = "/articles/v3")
    public AjaxResponse saveArticleV3(@RequestBody Article article) {
        log.info("saveArticle: " + article);
        return AjaxResponse.success(articleService.saveArticle(article));
    }

    /**
     * 更新一篇Article，使用PUT方法，以id为主键进行更新
     * //@RequestMapping(value = "/articles",method = RequestMethod.PUT)
     * 执行操作 更新
     * 请求方式 PUT
     * 传参形式 RequestBody
     * 访问地址 /rest/articles JSON
     */
    @PutMapping("/articles")
    public AjaxResponse updateArticle(@RequestBody Article article) {
        if (article.getId() == null) {
            //article.id是必传参数，因为通常根据id去修改数据
            //TODO 抛出一个自定义的异常
        }
        log.info("updateArticle:" + article);
        return AjaxResponse.success();
    }

    /**
     * 删除一篇Article，使用DELETE方法，参数是id
     * //@RequestMapping(value = "/articles/{id}",method = RequestMethod.DELETE)
     * 执行操作 删除
     * 请求方式 DELETE
     * 传参形式 PathVariable
     * 访问地址 /rest/articles/1
     */
    @DeleteMapping("/articles/{id}")
    public AjaxResponse deleteArticle(@PathVariable("id") Long id) {
        log.info("deleteArticle:" + id);
        return AjaxResponse.success();
    }

    @Resource
    ArticleService articleService;
}
